iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
Software Development

邁向專業軟體工程師必修的英文課系列 第 22

Day 22 - [連接詞四] 三個工程師必需具備的邏輯常識

  • 分享至 

  • xImage
  •  

這篇算是複習三個常見的邏輯知識:

邏輯匣

常見的邏輯匣有三個:And, or和not,它們有各自的圖形,像Android娃娃頭上的形狀就是And匣。
https://pics.me.me/android-nandroid-notoroid-ordroid-join-us-at-engineer-memes-857058.png
除了and, or, not之外,還有一種叫「互斥匣」,它搭配著And,Or和not之後,就會產生另外四種邏輯匣:XAND, XOR, XNAND, XNOR。雖然做軟體的不太管「匣」這件事情,但邏輯上還是相通的,但在軟體開發時比較常用的只有And, OR, NOT以及接下來要說的XOR。
(不是其他的不存在,可以透過其他方法來實做相關的匣)
什麼是XOR?為什麼他特別到很多語言都願意把他納入位元運算裡呢?
它的輸出是
XOR
XOR具備什麼特性?假設有個需求,是要挑出住在台北,但出生地不在台北,或者出生地是台北,但目前不住在台北的人。原本它的條件應該是

    ((user.BirthPlace == TAIPEI && user.Address != TAIPEI) || (user.BirthPlace != TAIPEI && user.Address == TAIPEI))

但透過XOR的真值表可以發現,當輸入值同時為true或同時為false時,輸出會是false,所以這個可以簡單的寫成:

    (user.BirthPlace == TAIPEI ^ user.Address == TAIPEI)

XOR大多數的使用場景都是在位元運算,特別是加密、備份、或考試的時候會用到,不過有些場景還是很適合使用。

真值表和文氏圖

如果常搞不清楚條件裡是否要包含某些條件,真值表(Truth Table)和文氏圖(Venn Diagrams)是你的好朋友。
真值表是用來列出所有可能條件的大表,使用時把輸入的條件,以及運算的結果列出來。
以上面的例子:要挑出住在台北,但出生地不在台北,或者出生地是台北,但目前不住在台北的人,真值表的長相就是:

P Q P^Q
T T F
T F T
F T T
F F F
而文氏圖,則是用圖像化的方式顯示應該包含的結果,以上面的例子來看,XOR的文氏圖就是
https://ithelp.ithome.com.tw/upload/images/20200923/20111458RW2PSCXhG9.png
為什麼真值表跟文氏圖對工程師那麼重要呢?因為它是確認需求非常方便的一項工具,如果條件開始複雜起來,就應該用這些工具建立測試案例,並和專案經理確認條件是否正確。

De Morgan's laws

在討論if的用法時曾提到if因為太方便而常常導致濫用,但有時候還是免不了需要對付一些很複雜的條件:很多&&,||,!甚至還有許多的括號。
狄摩根定律就是用在處理這方面的問題,那什麼是De Morgan's laws呢?

A && B == !A || !B

...感覺變得更複雜了,那裡方便了?
這就要回到更前一天的[副詞] Not,你的變數被旋轉了嗎?,例如如果我想買一台Phash Speed 5
PS5
我的條件是:

    if(!(I.HaveMoney && PS5.IsAvaliable && Wife.AllowsMeToGetOne)) 
        BuyAPlashSpeedFive();

邏輯上說得通,但語意上因為那個不起眼的驚嘆號而整個反轉,而且有很多層的括號,因此改寫成:

    if(!I.HaveMoney || !PS5.IsAvaliable || !Wife.AllowsMeToGetOne) 
        BuyAPlashSpeedFive();

閱讀上就更容易理解了。

以上就是三個我認為軟體工程師:只要是軟體工程師,都應該要知道的三個邏輯方面的小常識,有些可能在計算機概論上過,有些可能在一些文件裡看過。可能不常用但建議還是多研究看看,很有幫助喔!

XOR gate
Truth Table
Venn Diagrams
De Morgan's Laws


上一篇
Day 21 - [連接詞三] And and Or,And or Or ?
下一篇
Day 23 - [感嘆詞] 寫出讓人了解的訊息
系列文
邁向專業軟體工程師必修的英文課30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言